package main

import (
	"fmt"
	"os"
	"os/signal"
	"strconv"
	"strings"
	"syscall"
	"unicode/utf16"
	"unsafe"
)

// 获取字符串的长度指针
func lenPtr(s string) uintptr {
	return uintptr(len(s))
}

// 获取数字的指针
func IntPtr(n int) uintptr {
	return uintptr(n)
}

// 获取字符串的指针
func StrPtr(s string) uintptr {
	return uintptr(unsafe.Pointer(syscall.StringBytePtr(s)))
}

func UTF16PtrToString(cstr *uint16) string {
	if cstr != nil {
		us := make([]uint16, 0, 256)
		for p := uintptr(unsafe.Pointer(cstr)); ; p += 2 {
			u := *(*uint16)(unsafe.Pointer(p))
			if u == 0 {
				return string(utf16.Decode(us))
			}
			us = append(us, u)
		}
	}

	return ""
}
//function TryReadRFTag:PChar ;
//
//读取多标签数据
//读取到的标签列表，Key（16字节）+Item（6字节）+Num(2字节），
//Key为标签ID，Item为菜品编号，Num 为菜品数量。
//Num=00时，代表拼盘的菜品为半份，读到多个标签时，标签信息之间用@符号分隔。
func TryReadRFTag() (string, error) {
	// 创建 LazyDLL 对象
	dll := syscall.NewLazyDLL("ReadRfid.dll")
	if dll != nil {
		fmt.Errorf("error loading library: %v", dll)
	}
	f := dll.NewProc("InitRFIDConn")
	opType := IntPtr(2)
	defaultIP := StrPtr("192.168.0.222")
	defaultPort := StrPtr("9909")
	com := StrPtr("COM1")
	rate := StrPtr("38400")
	opFrame := StrPtr("8E1")
	// 传值
	res, _, _ := f.Call(opType,defaultIP,defaultPort,com,rate,opFrame)
	fmt.Println(res)


	// 创建 LazyProc 对象
	proc := dll.NewProc("TryReadRFTag")
	if proc != nil {
		 fmt.Errorf("error getting procedure address: %v", proc)
	}

	// 调用函数
	ret, _, _:= proc.Call()

	// 将返回的指针转换为 Go 字符串
	resultPtr := (*uint16)(unsafe.Pointer(ret))

	resultStr := UTF16PtrToString(resultPtr)

	fmt.Println(resultStr)

	return resultStr, nil
}


// 解析标签数据
func parseTagData(tagData string) []map[string]string {
	var tags []map[string]string

	tagsList := strings.Split(tagData, "@")
	for _, tagStr := range tagsList {
		if len(tagStr) < 24 { // 最小长度应为 16 + 6 + 2 = 24
			continue
		}

		key := tagStr[:16]
		item := tagStr[16:22] // 6 字节
		numStr := tagStr[22:24] // 2 字节

		// 解析 Num
		num, err := strconv.ParseInt(numStr, 16, 16)
		if err != nil {
			fmt.Printf("Error parsing num: %v\n", err)
			continue
		}

		tag := map[string]string{
			"Key":  key,
			"Item": item,
			"Num":  fmt.Sprintf("%d", num),
		}

		tags = append(tags, tag)
	}

	return tags
}

func main() {
	sig := make(chan os.Signal, 2)
	//// 读取dll
	//lib := syscall.NewLazyDLL("ReadRfid.dll")
	//// 调用dll函数
	//f := lib.NewProc("InitRFIDConn")
	//opType := IntPtr(2)
	//defaultIP := StrPtr("192.168.0.222")
	//defaultPort := StrPtr("9909")
	//com := StrPtr("COM1")
	//rate := StrPtr("38400")
	//opFrame := StrPtr("8E1")
	//// 传值
	//res, _, _ := f.Call(opType,defaultIP,defaultPort,com,rate,opFrame)
	//fmt.Printf("connext status  %v\n", res)
	//
	//
	//// 创建 LazyProc 对象
	//proc := lib.NewProc("TryReadRFTag")
	//if proc != nil {
	//	fmt.Errorf("error getting procedure address: %v", proc)
	//}
	//
	//// 调用函数
	//reader, _, _:= proc.Call()
	//
	//
	//// 将返回的指针转换为 Go 字符串
	//resultPtr := (*uint16)(unsafe.Pointer(reader))
	// 调用函数
	result, err := TryReadRFTag()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 解析标签数据
	tags := parseTagData(result)
	for _, tag := range tags {
		fmt.Printf("Key: %s, Item: %s, Num: %s\n", tag["Key"], tag["Item"], tag["Num"])
	}
	signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
	<- sig
}